package org.projetjava.metier.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


import org.projetjava.metier.model.Lieu;
import org.projetjava.metier.model.Poi;
import org.projetjava.metier.model.Parcours;

public class PoiDao extends Bdd {
	
	private Connection con;
	private PreparedStatement prepStatPoi = null;
	private PreparedStatement prepStatPoiLieu = null;
	private PreparedStatement prepStatLieuImagePoiLieu = null;
	private PreparedStatement prepStatPoiParcours = null;
	private PreparedStatement prepStatLieuImagePoiParcours = null;
	private PreparedStatement prepStatLieuPoiParcours = null;
	private PreparedStatement prepStatAjoutPoiLieu = null;
	private PreparedStatement prepStatAjoutImagePoi = null;
	private PreparedStatement prepStatModifierPoi = null;
	private PreparedStatement prepStatSupprParcoursContient = null;
	private PreparedStatement prepStatSupprImages = null;
	private PreparedStatement prepStatSupprHyperText = null;
	private PreparedStatement prepStatSupprPoi = null;
	private PreparedStatement prepStatParcoursPoi = null;
	private PreparedStatement prepStatIdDernierPoi = null;
	private PreparedStatement prepStatListPoi = null;
	private PreparedStatement prepStatSelectPoiLibelle = null;
	private PreparedStatement poiexist  = null;
	
	public PoiDao()
	{
		super();
		this.con = this.getConnection();
	}
	
	
	public void ajouter(Lieu lieu, int idLieu)
	{
		try{
			//poi
			if(this.prepStatAjoutPoiLieu == null)
			{
				this.prepStatAjoutPoiLieu = this.con.prepareStatement("INSERT INTO POI(coordX_POI, coordY_POI, Libelle_POI, Texte_Description_POI, ID_Lieu) VALUES (?,?,?,?,?)");
			}
			//Ajout IMAGES
			if(this.prepStatAjoutImagePoi == null)
			{
				this.prepStatAjoutImagePoi = this.con.prepareStatement("INSERT INTO Images(Lien_Images, ID_POI) VALUES (?,?)");
			}
			
			if(this.prepStatIdDernierPoi== null)
			{
				this.prepStatIdDernierPoi = this.con.prepareStatement("SELECT Max(ID_POI) FROM POI");
			}
			
			int idPoi = 0;
			
			for(Poi poi: lieu.getListPoi())
			{
				//poi infos
				this.prepStatAjoutPoiLieu.setInt(1,poi.getX());
				this.prepStatAjoutPoiLieu.setInt(2,poi.getY());
				this.prepStatAjoutPoiLieu.setString(3,poi.getLibelle().toString());
				this.prepStatAjoutPoiLieu.setString(4,poi.getDescription().toString());
				this.prepStatAjoutPoiLieu.setInt(5,idLieu);
				this.prepStatAjoutPoiLieu.executeUpdate();
				
				
				//execution
				ResultSet resultId = this.prepStatIdDernierPoi.executeQuery();
				
				//boucle sur result
				while(resultId.next()){   
					//1 er résultat
					if(resultId.first())
					{
						idPoi = (int) resultId.getObject(1);
					}
				}
				
				
				
			
				//hypertext
				HyperTextDao daoHypertext = new HyperTextDao();
				daoHypertext.AjoutHyperTextPoi(poi,idPoi);
				
				//image
				for(String list : poi.getLienImages())
				{
					this.prepStatAjoutImagePoi.setString(1, list);
					this.prepStatAjoutImagePoi.setInt(2, idPoi);
					this.prepStatAjoutImagePoi.executeUpdate();
				}
			}

		} catch (SQLException e) { 
			e.printStackTrace();
	    }
	}
	
	public void modifier(Lieu lieu, int idLieu)
	{
		try{
			
			if(this.prepStatAjoutPoiLieu == null)
			{
				this.prepStatAjoutPoiLieu = this.con.prepareStatement("INSERT INTO POI(coordX_POI, coordY_POI, Libelle_POI, Texte_Description_POI, ID_Lieu) VALUES (?,?,?,?,?)");
			}
			if(this.prepStatIdDernierPoi== null)
			{
				this.prepStatIdDernierPoi = this.con.prepareStatement("SELECT Max(ID_POI) FROM POI");
			}
			if(this.prepStatModifierPoi == null)
			{
				this.prepStatModifierPoi = this.con.prepareStatement("DELETE FROM POI WHERE ID_Lieu = ?");
			}
			if(this.prepStatParcoursPoi == null)
			{
				this.prepStatParcoursPoi = this.con.prepareStatement("INSERT INTO ParcoursContient(ID_POI, ID_Parcours) VALUES (?,?)");
			}
			if(this.prepStatAjoutImagePoi == null)
			{
				this.prepStatAjoutImagePoi = this.con.prepareStatement("INSERT INTO Images(Lien_Images, ID_POI) VALUES (?,?)");
			}
			if(this.prepStatSupprParcoursContient == null)
			{
				this.prepStatSupprParcoursContient= this.con.prepareStatement("DELETE FROM ParcoursContient WHERE ID_Poi = ?");
			}
			if(this.prepStatSupprImages == null)
			{
				this.prepStatSupprImages = this.con.prepareStatement("DELETE FROM Images WHERE ID_Poi = ?");
			}
			if(this.prepStatSupprHyperText == null)
			{
				this.prepStatSupprHyperText = this.con.prepareStatement("DELETE FROM LienHyperText WHERE ID_Poi = ?");
			}
			
			
			
			for(Poi poi: lieu.getListPoi())
			{
				
				this.prepStatSupprParcoursContient.setInt(1, poi.getId());
				this.prepStatSupprParcoursContient.executeUpdate();
				
				this.prepStatSupprImages.setInt(1, poi.getId());
				this.prepStatSupprImages.executeUpdate();
				
				this.prepStatSupprHyperText.setInt(1, poi.getId());
				this.prepStatSupprHyperText.executeUpdate();
				
			}
			
				this.prepStatModifierPoi.setInt(1, lieu.getId());
				this.prepStatModifierPoi.executeUpdate();
				
				int idPoi = 0;
			for(Poi poi: lieu.getListPoi())
			{	
				//poi infos
				this.prepStatAjoutPoiLieu.setInt(1,poi.getX());
				this.prepStatAjoutPoiLieu.setInt(2,poi.getY());
				this.prepStatAjoutPoiLieu.setString(3,poi.getLibelle().toString());
				this.prepStatAjoutPoiLieu.setString(4,poi.getDescription().toString());
				this.prepStatAjoutPoiLieu.setInt(5,idLieu);
				this.prepStatAjoutPoiLieu.executeUpdate();
					
	
				//execution
				ResultSet resultId = this.prepStatIdDernierPoi.executeQuery();
					
				//boucle sur result
				while(resultId.next()){   
					//1 er résultat
					if(resultId.first())
					{
						idPoi = (int) resultId.getObject(1);
					}
				}
					
				//hypertext
				HyperTextDao daoHypertext = new HyperTextDao();
				daoHypertext.AjoutHyperTextPoi(poi,idPoi);
					
				//image
				for(String list : poi.getLienImages())
				{
					this.prepStatAjoutImagePoi.setString(1, list);
					this.prepStatAjoutImagePoi.setInt(2, idPoi);
					this.prepStatAjoutImagePoi.executeUpdate();
				}
				//parcours
				for(Parcours poiparcours: poi.getParcoursPoi())
				{
					this.prepStatParcoursPoi.setInt(1, idPoi);
					this.prepStatParcoursPoi.setInt(2, poiparcours.getId());
					this.prepStatParcoursPoi.executeUpdate();
				}
				
				
				
				
			}
			
			
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
	}
	
	public void supprimer(Lieu lieu)
	{
		try{
		
			if(this.prepStatSupprParcoursContient == null)
			{
				this.prepStatSupprParcoursContient= this.con.prepareStatement("DELETE FROM ParcoursContient WHERE ID_Poi = ?");
			}
			if(this.prepStatSupprImages == null)
			{
				this.prepStatSupprImages = this.con.prepareStatement("DELETE FROM Images WHERE ID_Poi = ?");
			}
			if(this.prepStatSupprHyperText == null)
			{
				this.prepStatSupprHyperText = this.con.prepareStatement("DELETE FROM LienHyperText WHERE ID_Poi = ?");
			}
			if(this.prepStatSupprPoi == null)
			{
				this.prepStatSupprPoi = this.con.prepareStatement("DELETE FROM POI WHERE ID_Poi = ?");
			}
			
			for(Poi poi: lieu.getListPoi())
			{
			
				this.prepStatSupprParcoursContient.setInt(1, poi.getId());
				this.prepStatSupprParcoursContient.executeUpdate();
				
				
				this.prepStatSupprImages.setInt(1, poi.getId());
				this.prepStatSupprImages.executeUpdate();
				
				this.prepStatSupprHyperText.setInt(1, poi.getId());
				this.prepStatSupprHyperText.executeUpdate();
				
				this.prepStatSupprPoi.setInt(1, poi.getId());
				this.prepStatSupprPoi.executeUpdate();
				
				
			
			}
		
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
	}
	
	
	
	
	public List<Poi> SelectPoi()
	{
		List<Poi> listPoi = new ArrayList<>();
		try {
			
			if(this.prepStatPoi == null)
			{
				this.prepStatPoi = this.con.prepareStatement("SELECT P.coordX_POI,P.coordY_POI,Texte_Description_POI,P.Libelle_POI,P.ID_POI,L.Libelle_Lieu FROM Lieu L, POI P WHERE L.ID_Lieu = P.ID_Lieu");
			}
			ResultSet resultPoi = this.prepStatPoi.executeQuery();
			
			while(resultPoi.next())
			{
				Poi poi = new Poi();
				
				poi.setX((int) resultPoi.getObject(1));
				poi.setY((int) resultPoi.getObject(2));
				poi.setLibelle(resultPoi.getObject(4).toString());
				poi.setDescription(resultPoi.getObject(3).toString());
				poi.setLieu(resultPoi.getObject(6).toString());
				poi.setId((int) resultPoi.getObject(5));
				
				
				//hypertext	
				HyperTextDao daoHypertext = new HyperTextDao();
				poi.setLienHyperText(daoHypertext.SelectHyperTextPoi((int) resultPoi.getObject(5)));
				
				//images
				List<String> listImage = new ArrayList<>();
				
				//requete préparé des liens des images
				if(this.prepStatLieuImagePoiLieu == null)
				{
					this.prepStatLieuImagePoiLieu = this.con.prepareStatement("SELECT Lien_Images FROM `Images` WHERE ID_POI =?");
				}
				
				//argument
				this.prepStatLieuImagePoiLieu.setInt(1, (int) resultPoi.getObject(5));
				
				//on stock dans le resultLienImage
				ResultSet resultLienImage = this.prepStatLieuImagePoiLieu.executeQuery();
				while(resultLienImage.next()){
					listImage.add(resultLienImage.getObject(1).toString());
				}
				//on ajoute à l'aide du setteur
				poi.setLienImages(listImage);
				
				listPoi.add(poi);
			}
			
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
			
		return listPoi;
	}
	
	public List<Poi> SelectPoiLieu(int idLieu)
	{
		List<Poi> listPoi = new ArrayList<>();
		
		
		try {
			if(this.prepStatPoiLieu == null)
			{
				this.prepStatPoiLieu = this.con.prepareStatement("SELECT P.coordX_POI,P.coordY_POI,Texte_Description_POI,P.Libelle_POI,P.ID_POI,L.Libelle_Lieu FROM Lieu L, POI P WHERE L.ID_Lieu = P.ID_Lieu AND L.ID_Lieu = ?");
			}
			this.prepStatPoiLieu.setInt(1, idLieu);
			
			ResultSet resultPoi = this.prepStatPoiLieu.executeQuery();
			
			while(resultPoi.next())
			{
				Poi poi = new Poi();
				
				poi.setX((int) resultPoi.getObject(1));
				poi.setY((int) resultPoi.getObject(2));
				poi.setLibelle(resultPoi.getObject(4).toString());
				poi.setDescription(resultPoi.getObject(3).toString());
				poi.setLieu(resultPoi.getObject(6).toString());
				poi.setId((int) resultPoi.getObject(5));
				
				//hypertext	
				HyperTextDao daoHypertext = new HyperTextDao();
				poi.setLienHyperText(daoHypertext.SelectHyperTextPoi((int) resultPoi.getObject(5)));
				
				//images
				List<String> listImage = new ArrayList<>();
				
				//requete préparé des liens des images
				if(this.prepStatLieuImagePoiLieu == null)
				{
					this.prepStatLieuImagePoiLieu = this.con.prepareStatement("SELECT Lien_Images FROM `Images` WHERE ID_POI =?");
				}
				
				//argument
				this.prepStatLieuImagePoiLieu.setInt(1, (int) resultPoi.getObject(5));
				
				//on stock dans le resultLienImage
				ResultSet resultLienImage = this.prepStatLieuImagePoiLieu.executeQuery();
				while(resultLienImage.next()){
					listImage.add(resultLienImage.getObject(1).toString());
				}
				//on ajoute à l'aide du setteur
				poi.setLienImages(listImage);
				
				
				
				
				//liste des parcours d'un POI
				List<Parcours> listParcoursPoi = new ArrayList<>();
				if(this.prepStatLieuPoiParcours == null)
				{
					this.prepStatLieuPoiParcours = this.con.prepareStatement("SELECT * FROM ParcoursContient PC, Parcours P WHERE P.ID_Parcours = PC.ID_Parcours AND PC.ID_POI = ?");
				}
				this.prepStatLieuPoiParcours.setInt(1, (int) resultPoi.getObject(5));
				ResultSet resultLieuUnPoi = this.prepStatLieuPoiParcours.executeQuery();
				while(resultLieuUnPoi.next()){
					Parcours parcours = new Parcours();
					parcours.setLibelle(resultLieuUnPoi.getObject(4).toString());
					parcours.setDescription(resultLieuUnPoi.getObject(5).toString());
					parcours.setId((int) resultLieuUnPoi.getObject(2));
					
					listParcoursPoi.add(parcours);
				}
				
				poi.setParcoursPoi(listParcoursPoi);
				
				
				listPoi.add(poi);
			}
			
			
			
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
		
		
		return listPoi;
	}
	
	
	public List<Poi> SelectPoiParcours(int idParcours)
	{
		List<Poi> listPoi = new ArrayList<>();
		
		try {
			if(this.prepStatPoiParcours == null)
			{
				this.prepStatPoiParcours = this.con.prepareStatement("SELECT P.coordX_POI, P.coordY_POI, P.Libelle_POI, P.Texte_Description_POI, L.Libelle_Lieu, P.ID_POI FROM ParcoursContient PC, POI P, Lieu L WHERE P.ID_POI = PC.ID_POI and P.ID_Lieu = L.ID_Lieu AND PC.ID_Parcours = ?");
			}
			this.prepStatPoiParcours.setInt(1, idParcours);
			ResultSet resultPoiParcours = this.prepStatPoiParcours.executeQuery();
			while(resultPoiParcours.next()){
				Poi poi = new Poi();
				
				poi.setX((int) resultPoiParcours.getObject(1));
				poi.setY((int) resultPoiParcours.getObject(2));
				poi.setLibelle(resultPoiParcours.getObject(3).toString());
				poi.setDescription(resultPoiParcours.getObject(4).toString());
				poi.setLieu(resultPoiParcours.getObject(5).toString());
				poi.setId((int) resultPoiParcours.getObject(6));
				
				
				//hypertext			
				HyperTextDao daoHypertext = new HyperTextDao();
				poi.setLienHyperText(daoHypertext.SelectHyperTextPoi((int) resultPoiParcours.getObject(6)));
				
				//images
				List<String> listImage = new ArrayList<>();
				
				//requete préparé des liens des images
				if(this.prepStatLieuImagePoiParcours == null)
				{
					this.prepStatLieuImagePoiParcours = this.con.prepareStatement("SELECT Lien_Images FROM `Images` WHERE ID_POI =?");
				}
				
				//argument
				this.prepStatLieuImagePoiParcours.setInt(1, (int) resultPoiParcours.getObject(6));
				
				//on stock dans le resultLienImage
				ResultSet resultLienImage = this.prepStatLieuImagePoiParcours.executeQuery();
				while(resultLienImage.next()){
					listImage.add(resultLienImage.getObject(1).toString());
				}
				//on ajoute à l'aide du setteur
				poi.setLienImages(listImage);
				
				
				
				//liste des parcours d'un POI
				List<Parcours> listParcoursPoi = new ArrayList<>();
				if(this.prepStatLieuPoiParcours == null)
				{
					this.prepStatLieuPoiParcours = this.con.prepareStatement("SELECT * FROM ParcoursContient PC, Parcours P WHERE P.ID_Parcours = PC.ID_Parcours AND PC.ID_POI = ?");
				}
				this.prepStatLieuPoiParcours.setInt(1, (int) resultPoiParcours.getObject(6));
				ResultSet resultParcoursunPoi = this.prepStatLieuPoiParcours.executeQuery();
				while(resultParcoursunPoi.next()){
					Parcours parcours = new Parcours();
					parcours.setLibelle(resultParcoursunPoi.getObject(4).toString());
					parcours.setDescription(resultParcoursunPoi.getObject(5).toString());
					parcours.setId((int) resultParcoursunPoi.getObject(2));
					
					listParcoursPoi.add(parcours);
				}
				
				poi.setParcoursPoi(listParcoursPoi);
				
				
				
				
				listPoi.add(poi);
				
			}
		
		
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
		
		return listPoi;
	
	}
	
	
	public List<String> ListPoi()
	{
		List<String> listPoi = new ArrayList<>();
		
		try {
			if(this.prepStatListPoi== null)
			{
				this.prepStatListPoi = this.con.prepareStatement("SELECT Libelle_POI FROM POI");
			}
			ResultSet resultPoi = this.prepStatListPoi.executeQuery();
			while(resultPoi.next()){
				listPoi.add(resultPoi.getObject(1).toString());
			}
			
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
		
		return listPoi;
	}
	
	public Poi SelectPoiParLibelle(String libelle){
		
		Poi poi = new Poi();
		
		try {
			
			
			
			if(this.prepStatSelectPoiLibelle== null)
			{
				this.prepStatSelectPoiLibelle = this.con.prepareStatement("SELECT * FROM POI P,Lieu L WHERE Libelle_POI = ? AND P.ID_Lieu = L.ID_Lieu");
			}
			this.prepStatSelectPoiLibelle.setString(1, libelle);
			ResultSet resultPoi = this.prepStatSelectPoiLibelle.executeQuery();
			while(resultPoi.next()){
				if(resultPoi.first())
				{
					poi.setId((int) resultPoi.getObject(1));
					poi.setX((int) resultPoi.getObject(2));
					poi.setY((int) resultPoi.getObject(3));
					poi.setLibelle(libelle);
					poi.setDescription(resultPoi.getObject(5).toString());
					poi.setLieu(resultPoi.getObject(10).toString());
					
					
					//hypertext			
					HyperTextDao daoHypertext = new HyperTextDao();
					poi.setLienHyperText(daoHypertext.SelectHyperTextPoi((int) resultPoi.getObject(1)));
					
					
					//images
					List<String> listImage = new ArrayList<>();
					
					//requete préparé des liens des images
					if(this.prepStatLieuImagePoiParcours == null)
					{
						this.prepStatLieuImagePoiParcours = this.con.prepareStatement("SELECT Lien_Images FROM `Images` WHERE ID_POI =?");
					}
					
					//argument
					this.prepStatLieuImagePoiParcours.setInt(1, (int) resultPoi.getObject(1));
					
					//on stock dans le resultLienImage
					ResultSet resultLienImage = this.prepStatLieuImagePoiParcours.executeQuery();
					while(resultLienImage.next()){
						listImage.add(resultLienImage.getObject(1).toString());
					}
					//on ajoute à l'aide du setteur
					poi.setLienImages(listImage);
					
					
					//liste des parcours d'un POI
					List<Parcours> listParcoursPoi = new ArrayList<>();
					if(this.prepStatLieuPoiParcours == null)
					{
						this.prepStatLieuPoiParcours = this.con.prepareStatement("SELECT * FROM ParcoursContient PC, Parcours P WHERE P.ID_Parcours = PC.ID_Parcours AND PC.ID_POI = ?");
					}
					this.prepStatLieuPoiParcours.setInt(1, (int) resultPoi.getObject(1));
					ResultSet resultLieuUnPoi = this.prepStatLieuPoiParcours.executeQuery();
					while(resultLieuUnPoi.next()){
						Parcours parcours = new Parcours();
						parcours.setLibelle(resultLieuUnPoi.getObject(4).toString());
						parcours.setDescription(resultLieuUnPoi.getObject(5).toString());
						parcours.setId((int) resultLieuUnPoi.getObject(2));
						
						listParcoursPoi.add(parcours);
					}
					
					poi.setParcoursPoi(listParcoursPoi);
				}
				
			}
			
			
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
		
		return poi;
		
	}

}
